//package com.fyyg.monitor.job;
//
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.Calendar;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//import java.util.Random;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.Executors;
//import java.util.concurrent.Future;
//import java.util.concurrent.ScheduledExecutorService;
//import java.util.concurrent.TimeUnit;
//
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
//
//import com.alibaba.dubbo.config.annotation.Reference;
//import com.alibaba.fastjson.JSONObject;
//import com.fyyg.common.fyconst.PAYWAY;
//import com.fyyg.common.fyconst.PLATFORM;
//import com.fyyg.common.util.date.YXDate;
//import com.fyyg.interfaces.shop.TBusiShopProductBatchAdditionalGroupService;
//import com.fyyg.interfaces.user.TBusiMemberGoRecordService;
//import com.fyyg.interfaces.user.TBusiMemberService;
//import com.fyyg.interfaces.user.TBusiMemberSubsetService;
//import com.fyyg.model.TBusiCart;
//import com.fyyg.model.TBusiMember;
//import com.fyyg.model.TBusiMemberSubset;
//import com.fyyg.model.TBusiShopProductBatchAdditionalGroup;
//import com.github.pagehelper.StringUtil;
//
///**
// * 自动购买任务
// *
// * @author hang.ouyang
// * @date 2016-05-05 11:56
// */
//public class AutoBuyJob {
//
//    private final static Logger logger = LogManager.getLogger(AutoBuyJob.class);
//
//    public AutoBuyJob(){
//        logger.info("AutoBuyJob start.....");
//    }
//
//    @Reference
//    TBusiMemberService memberService;
//
//    @Reference
//    TBusiMemberSubsetService memberSubsetService;
//
//    @Reference
//    TBusiShopProductBatchAdditionalGroupService groupService;
//
//    @Reference
//    TBusiMemberGoRecordService goRecordService;
//
//
//    static Map<Integer,Future> futureMap = new ConcurrentHashMap<>();
//    static Map<Integer,TBusiMemberSubset> subsetMap = new ConcurrentHashMap<>();
//    static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
//
//    public void execute(){
//        logger.info("查询激活状态的子账户购买配置记录");
//        TBusiMemberSubset tempSubset = new TBusiMemberSubset();
//        tempSubset.setStatus(1);//激活状态
//        List<TBusiMemberSubset> subsetList =  memberSubsetService.selectByModel(tempSubset);
//        
//        
//        // 移除任务
//        if(subsetList == null || subsetList.size() <= 0 ){
//            Iterator<TBusiMemberSubset> subsetIterator =  subsetMap.values().iterator();
//            while (subsetIterator.hasNext()){
//                TBusiMemberSubset subset = subsetIterator.next();
//                subsetMap.remove(subset.getUid());
//                futureMap.get(subset.getUid()).cancel(false);
//                futureMap.remove(subset.getUid());
//                logger.info("移除用户\t"+subset.getUid()+"\t已经失效的任务配置\t"+subset.getId());
//            }
//            return;
//        }
//        
//        //运行任务中拥有激活状态购买任务的用户ID （更新运行中的任务， 实际目的 对比新旧任务设置是否一致 不一致，删除任务）
//        List<Integer> uidList = new ArrayList<>();
//        for (TBusiMemberSubset subset : subsetList) {
//        	
//        	// 当前小时段  子账户是否设置的购买频率
//        	String buyFrequency = whetherEffective(subset.getBuyFrequency());
//        	
//        	// 当前子账户自动购买任务存在，
//        	// 且执行中任务的修改时间 跟当前子账户修改时间一致 
//        	// 且当前扫描到的子账户的够买时间段里存在当时小时段
//        	// 且上一次运行的整点等于当前整点
//        	// 且当前扫描到的子账户在当前整点有设置过购买频率
//            if(subsetMap.get(subset.getUid()) != null 
//            		&& subsetMap.get(subset.getUid()).getUpdateTime().equals(subset.getUpdateTime()) 
//            		&& existHour(subset.getBuyPeriod())  
//            		&& subsetMap.get(subset.getUid()).getRunTime().equals(YXDate.getHour())
//            		&& StringUtil.isNotEmpty(buyFrequency) 
//            		&& Integer.parseInt(buyFrequency)>0 
//            		){
//                uidList.add(subset.getUid());
//            }
//        }
//        
//        
//        //移除无效的任务
//        Iterator<Integer> subsetIterator =  subsetMap.keySet().iterator();
//        while (subsetIterator.hasNext()){
//            Integer key = subsetIterator.next();
//            Future future = futureMap.get(key);
//            // 任务不为空，且任务运行中任务存在次任务，且此任务未完成，且任务没有被取消
//            if(future != null && uidList.contains(key) && !future.isDone() && !future.isCancelled()){
//               continue;
//            }else{
//                subsetMap.remove(key);
//                if(future != null){
//                    future.cancel(false);
//                    futureMap.remove(future);
//                    logger.info("移除已经失效的任务配置\t"+key);
//                }
//            }
//        }
//        
//        
//        
//        
//        for (final TBusiMemberSubset subset : subsetList) {
//            //没有修改配置 不处理
//            if(uidList.contains(subset.getUid())){
//                continue;
//            }
//            // 当前小时段  子账户是否设置的购买频率
//        	String buyFrequency = whetherEffective(subset.getBuyFrequency());
//            if(StringUtil.isEmpty(buyFrequency)){
//            	continue;
//            }
//            if(Integer.parseInt(buyFrequency)<=0){
//            	continue;
//            }
//            logger.info("新增用户\t"+subset.getUid()+"的自动购买任务start..");
//            Future future =  scheduler.scheduleWithFixedDelay(new Runnable() {
//                @Override
//                public void run() {
//                    if(subset == null){
//                     return;
//                    }
//                    //判断购买时间段
//                    Calendar calendar = Calendar.getInstance();
//                    Integer hour =  calendar.get(Calendar.HOUR_OF_DAY);
//                    int minute = calendar.get(Calendar.MINUTE);
//                    Random rand = new Random();
//                    if(hour == 10 && minute <=3){
//                    	return;
//                    }
//                    if(minute%10 == 1 || minute%10 == 2 || minute%10 == 3){
//                       if( rand.nextInt(10) >= 5){
//                           return;
//                       }
//                    }
//                    if(hour >= 22 || hour < 2){
//                        if(minute%10 == 5 || minute%10 == 6 || minute%10 ==7){
//                            if( rand.nextInt(10) >= 7){
//                                return;
//                            }
//                        }
//                    }
//
//                    if(subset.getBuyPeriod().contains(hour+"") == false){
//                        logger.info("用户\t"+subset.getUid()+"\t子账户自动购买任务\t"+subset.getId()+"\t不在购买时间段内");
//                        return;
//                    }
//
//                    logger.info("随机查询用户"+subset.getUid()+"子账户");
//                    //随机获取一个子账户
//                    TBusiMember member = memberService.selectOneRandomSubUser(subset.getUid());
//                    if(member.getMoney().doubleValue() <= 0 ){
//                        logger.info("用户\t"+subset.getUid()+"\t的子账户\t"+member.getUid()+"\t余额不足");
//                        return;
//                    }
//
//                    //选取购买数量
//                    String[] numArr = subset.getBuyNum().split(",");
//                    Integer number = Integer.parseInt(numArr[rand.nextInt(numArr.length)]);
//
//                    //选取商品
//                    TBusiShopProductBatchAdditionalGroup group = null;
//
//                    if(subset.getIsRandomBuy() == 1){
//                        //指定商户内随机购买商品
//                        TBusiShopProductBatchAdditionalGroup tempGroup = new TBusiShopProductBatchAdditionalGroup();
//                        tempGroup.setStatus(0);//筹购中的商品
//                        tempGroup.setShopId(subset.getShopId());//指定商户
//                        List<TBusiShopProductBatchAdditionalGroup> groupList = groupService.selectByModel(tempGroup);
//                        int index = 0;
//                        while (true){
//                            index += 1;
//                            if(index > 5 )
//                                return;
//                            if(groupList == null || groupList.size() <= 0 ){
//                                return;
//                            }
//                            group = groupList.get(rand.nextInt(groupList.size()));
//                            if(group.getSurplusNumber() <= 0){
//                                groupList.remove(group);
//                                continue;
//                            }
//                            // 百分比购买
//                            if(subset.getIsPercent()==1){
//                            	double percent =Double.valueOf(number)/100;
//                            	number=(int) (group.getRequiredNumber()*percent);
//                            }
//                            //随机购买数量不能大于购买数量的20%
//                            if(group.getRequiredNumber()*0.3 < number){
//                                logger.info("随机购买数量不能大于当前商品总需人数的30%");
//                                number = rand.nextInt((int)(group.getRequiredNumber().intValue()*0.3));
//                            }
//                            //随机挑选数量大于剩余数量则购买剩下所有的
//                            if(group.getSurplusNumber() < number){
//                                number = group.getSurplusNumber();
//                            }
//                            if(number*group.getPrice().doubleValue() > member.getMoney().doubleValue()){
//                                logger.info("用户\t"+subset.getUid()+"\t的子账户\t"+member.getUid()+"\t余额不足以支付随机抽取商品组\t"+group.getId());
//                                groupList.remove(group);
//                                continue;
//                            }
//                            break;
//                        }
//                    }else{
//                       //指定商品内随机购买商品
//                        if(subset.getBuyIds() == null || subset.getBuyIds().length() <= 0){
//                            return;
//                        }
//                        String[] groupIds = subset.getBuyIds().split(",");
//                        String pid =  groupIds[rand.nextInt(groupIds.length)];
//                        group = groupService.selectProductCurrentGroup(Integer.parseInt(pid));
//                        if(group == null){
//                            logger.info("随机挑选的商品\t"+pid+"\t当前在售商品组不存在");
//                            return;
//                        }
//                        // 百分比购买
//                        if(subset.getIsPercent()==1){
//                        	double percent =Double.valueOf(number)/100;
//                        	number=(int) (group.getRequiredNumber()*percent);
//                        }
//                        //随机购买数量不能大于购买数量的20%
//                        if(group.getRequiredNumber()*0.3 < number){
//                            logger.info("随机购买数量不能大于当前商品总需人数的30%");
//                            number = rand.nextInt((int)(group.getRequiredNumber().intValue()*0.3));
//                        }
//                        //随机挑选数量大于剩余数量则购买剩下所有的
//                        if(group.getSurplusNumber() < number){
//                            number = group.getSurplusNumber();
//                        }
//
//                        if(number*group.getPrice().doubleValue() > member.getMoney().doubleValue()){
//                            logger.info("用户\t"+subset.getUid()+"\t的子账户\t"+member.getUid()+"\t余额不足以支付随机抽取商品组\t"+group.getId());
//                            return;
//                        }
//                    }
//                    if(group == null){
//                        logger.info("没有找到满足条件的商品组");
//                        return;
//                    }
//                    //添加订单
//                    List<TBusiCart> cartList = new ArrayList<TBusiCart>();
//                    TBusiCart cart = new TBusiCart();
//                    cart.setUid(member.getUid());
//                    cart.setBuyNumber(number);
//                    cart.setGroupId(group.getId());
//                    cart.setPrice(group.getPrice());
//                    cartList.add(cart);
//                    logger.info("用户："+subset.getUid()+"的子账户："+member.getUid()+"__"+member.getUserName()+"自动购买商品组:"+group.getId()+" 数量:"+number+"下单start... 当前时间段："+YXDate.fromDate(YXDate.getTime())+"购买频率："+whetherEffective(subset.getBuyFrequency())+"秒 /次" );
//
//                    PLATFORM platform = PLATFORM.PC;
//                    int random = (int)(Math.random()*4)+1;
//                    if(random == 2)
//                        platform = PLATFORM.WX;
//                    if(random == 3)
//                        platform = PLATFORM.ANDROID;
//                    if(random == 4)
//                        platform = PLATFORM.IOS;
//
//                    Map<String,String> resultMap = goRecordService.addOrder(cartList,member.getUid(),"127.0.0.1",null, platform,true);
//                    if(resultMap.get("result") != null && resultMap.get("result").equals("success")){
//                        //支付
//                    	try {
//							Thread.sleep(1000);
//						} catch (InterruptedException e) {
//						}
//                        String batchNo = resultMap.get("orderNo");
//                        logger.info("自动购买商品组下单end 订单批次\t"+batchNo);
//                        resultMap = goRecordService.payAfter(batchNo, PAYWAY.YE);
//                        logger.info("自动购买商品组付款完成"+resultMap.toString());
//                    }else{
//                        //
//                        String message = resultMap.get("message") == null ? "" : resultMap.get("message");
//                        logger.info("自动购买商品组\t"+group.getId()+"下单失败"+resultMap+"\t"+ message);
//                        return;
//                    }
//                }
//            },0,Long.valueOf(buyFrequency), TimeUnit.SECONDS);
//            futureMap.put(subset.getUid(),future);
//            //录入当前任务执行的初始时间
//            subset.setRunTime(YXDate.getHour());
//            subsetMap.put(subset.getUid(),subset);
//            logger.info("新增用户\t"+subset.getUid()+"的自动购买任务end");
//        }
//    }
//    
//    
//    /**
//     * 设置的时间段内是否存在当前时间（小时）
//     */
//    public static boolean existHour(String buyPeriod){
//    	boolean status=false;
//    	try {
//	    	String[] arr =buyPeriod.split(",");
//	    	List<String> list = Arrays.asList(arr);
//	    	status = list.contains(YXDate.getHour());
//    	} catch (NumberFormatException e) {
//			e.printStackTrace();
//			status=false;
//		}
//    	return status;
//    }
//    
//    /**
//     * 当前账户 时间段购买频率
//     * @param buy_frequency
//     * @return
//     */
//    public static String whetherEffective(String buy_frequency){
//    	String status = null;
//    	try {
//			if(StringUtil.isEmpty(buy_frequency)){
//				status = null;
//			}else{
//				JSONObject json = new JSONObject().parseObject(buy_frequency);
//				String hour = Integer.parseInt(YXDate.getHour())+"";
//				Object frequency = json.get(hour);
//				System.out.println("=============当前时间点："+hour+"\t 购买频率："+frequency+" 秒/次");
//				if(null==frequency || frequency.equals("")){
//					status = null;	
//				}else{
//					status = frequency.toString();
//				}
//			}
//		} catch (NumberFormatException e) {
//			e.printStackTrace();
//			status = null;	
//		}
//    	return status;
//    } 
//    
//    
//    
//    public static void main(String[] args) {
//    	JSONObject json = new JSONObject().parseObject("{0:0,1:1,2:2,3:3}");
//    	System.out.println(json.get("0"));
//		
//	}
//
//}
